package pres.liko.iot.service;

import reactor.core.publisher.Mono;

import java.util.Map;
import java.util.Set;

/**
 * @ClassName: CacheService
 * @Auther: liko
 * @Description:
 * @Date: 2022/10/31 21:48
 */
public interface CacheService {

    /**
     * String 传过来的参数都不能为空
     *
     * @param key
     * @param value
     * @return
     */
    public Mono<Boolean> set(String key, String value);

    /**
     * String 获取数据
     *
     * @param key
     * @return
     */
    Mono<String> get(String key);

    /**
     * String 带过期时间设置
     *
     * @param key
     * @param value
     * @param expireTime 如果过期时间是-1或者0 就默认是永久,其他都是设置过期时间；如果是负数，取绝对值
     * @return
     */
    Mono<Boolean> setValueWithExp(String key, String value, Long expireTime);

    /**
     * String 根据指定步长进行自增
     *
     * @param key
     * @param step
     * @return
     */
    Mono<Long> incrementBy(String key, Long step);

    /**
     * String 只有当前key不存在的时候设置值
     *
     * @param key
     * @param value
     * @return
     */
    Mono<Boolean> setNx(String key, String value);

    /**
     * hash 设置值
     *
     * @param key
     * @param fieId
     * @param value
     * @return
     */
    Mono<Boolean> hSet(String key, String fieId, String value);

    /**
     * hash 批量设置值
     *
     * @param key
     * @param values
     * @return
     */
    Mono<Boolean> hMset(String key, Map values);

    /**
     * hash 根据key获取当前结构中的全部
     *
     * @param key
     * @return
     */
    Mono<Map> hGetAll(String key);

    /**
     * set 添加
     *
     * @param key
     * @param member
     * @return
     */
    Mono<Long> sAdd(String key, String member);

    /**
     * set 批量添加
     *
     * @param key
     * @param members
     * @return
     */
    Mono<Long> sAddMembers(String key, Set<String> members);

    /**
     * 根据key获取value
     *
     * @param key
     * @return
     */
    Mono<Set<String>> sget(String key);

    /**
     * 按照key删除全部value
     *
     * @param keys
     * @return
     */
    Mono<Long> sdeleteKeys(String... keys);

    /**
     * 判断key集合中是否存在value
     *
     * @param key
     * @param value
     * @return
     */
    Mono<Boolean> sIsMember(String key, String value);
}
